package learningThread.syn.synchronizedMethodLockObj.syschronizeObj;

/**
 * synchronized是获取对象的锁
 * c 线程先持有对象的锁，d 线程可以异步方式调用对象中的 非synchronized方法
 * c 线程先持有对象的锁，d 线程 执行 synchronized方法时 必须同步，等待。
 *
 * 避免脏读的问题，对 对象的 set/update 加锁的同时， 也需要对 get方法加锁
 */
public class OperationObj {



    public synchronized void methodA(){
        System.out.println("调用A方法");
        try {
            System.out.println("begin method:"+Thread.currentThread().getName());
            Thread.sleep(5000);
            System.out.println("end method:"+Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void methodB(){
        System.out.println("调用B方法");
        try {
            System.out.println("begin method:"+Thread.currentThread().getName());
            Thread.sleep(5000);
            System.out.println("end method:"+Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
